package com.roncoo.permission.config;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.roncoo.permission.entity.Admin;
import com.roncoo.permission.entity.AdminroleTMenu;
import com.roncoo.permission.service.IAdminService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.Subject;

import javax.annotation.Resource;
import java.util.List;

/**
 * @Author: 越川豪
 * @Date: 2021/3/29 11:24
 */
public class AdminRlam extends AuthorizingRealm {

    @Resource
    public IAdminService adminService;

    /**
     * 授权
     *
     * @param principalCollection
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        //给资源进行授权
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        //获取当前登录用户
        Subject subject = SecurityUtils.getSubject();
        Admin admin = (Admin) subject.getPrincipal();
        //添加资源
        //查询资源 根据当前的登录的用户的id 查询这个用户的所有的资源
        Integer adminroleid = admin.getAdminroleid();
        List<String> menuByRoleid = adminService.findMenuByRoleid(adminroleid);
        //给用户添加资源
        info.addStringPermissions(menuByRoleid);
        return info;
    }

    /**
     * 认证
     *
     * @param authenticationToken
     * @return
     * @throws AuthenticationException
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        //获取令牌 token携带者 用户名 密码
        UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
        //获取用户名
        String phone = token.getUsername();
        System.out.println(phone);
        // 1.根据用户名 查询 数据据库里是否有这个对象
        QueryWrapper<Admin> queryWrapper = new QueryWrapper();
        queryWrapper.eq("phone", phone);
        Admin admin = adminService.getOne(queryWrapper);
        if (admin == null) {
            // 没有查到此用户 shiro底层会抛出UnKnowAccountException
            return null;
        }
        //2.判断密码
        //admin.getPassword()，注意这里是指从数据库中获取的password。第三个字段是realm，即当前realm的名称。
        //这块对比逻辑是先对比username，但是username肯定是相等的，所以真正对比的是password。
        //从这里传入的password（这里是从数据库获取的）和token（filter中登录时生成的）中的password做对比，如果相同就允许登录，
        // 不相同就抛出IncorrectCredentialsException异常。
        //如果认证不通过，就不会执行下面的授权方法了
        return new SimpleAuthenticationInfo(admin, admin.getPassworld(), "");
    }
}
